home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cpp_libs
/
answrbok
/
8_6.lha
/
8_6
/
out.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-08
|
5KB
|
292 lines
* Copyright (c) 1990 by AT&T Bell Telephone Laboratories, Incorporated. */
* The C++ Answer Book */
* Tony Hansen */
* All rights reserved. */
*ident "@(#)cfront:lib/stream/out.c 1.6" */
*
C++ stream i/o source
out.c
/
include <string.h>
include <stream.h>
define MAXOSTREAMS 20
onst cb_size = 1024;
onst fld_size = 256;
* a circular formating buffer */
tatic char formbuf[cb_size]; // some slob for form overflow
tatic char* bfree=formbuf;
tatic char* max = &formbuf[cb_size-1];
har* chr(register i, register int w) /* note: chr(0) is "" */
register char* buf = bfree;
if (w<=0 || fld_size<w) w = 1;
w++; /* space for trailing 0 */
if (max < buf+w) buf = formbuf;
bfree = buf+w;
char * res = buf;
w -= 2; /* pad */
while (w--) *buf++ = ' ';
if (i<0 || 127<i) i = ' ';
*buf++ = i;
*buf = 0;
return res;
har* str(const char* s, register int w)
register char* buf = bfree;
int ll = strlen(s);
if (w<=0 || fld_size<w) w = ll;
if (w < ll) ll = w;
w++; /* space for traling 0 */
if (max < buf+w) buf = formbuf;
bfree = buf+w;
char* res = buf;
w -= (ll+1); /* pad */
while (w--) *buf++ = ' ';
while (*s) *buf++ = *s++;
*buf = 0;
return res;
har* form(const char* format ...)
register* ap = (int*)((char*)&format+sizeof(char*)); // not completely general
register char* buf = bfree;
if (max < buf+fld_size) buf = formbuf;
register ll = sprintf(buf,format,ap[0],ap[1],ap[2],ap[3],ap[4],ap[5],ap[6],ap[7],ap[8],ap[9]); // too few words copied
if (0<ll && ll<cb_size) // length
;
else if (buf<(char*)ll && (char*)ll<buf+cb_size)// pointer to trailing 0
ll = (char*)ll - buf;
else
ll = strlen(buf);
if (fld_size < ll) exit(10);
bfree = buf+ll+1;
return buf;
onst char a10 = 'a'-10;
har* hex(long ii, register w)
int m = sizeof(long)*2; // maximum hex digits for a long
if (w<0 || fld_size<w) w = 0;
int sz = (w?w:m)+1;
register char* buf = bfree;
if (max < buf+sz) buf = formbuf;
register char* p = buf+sz;
bfree = p+1;
*p-- = 0; // trailing 0
register unsigned long i = ii;
if (w) {
do {
register h = (int)(i&0xf);
*p-- = (h < 10) ? h+'0' : h+a10;
} while (--w && (i>>=4));
while (0<w--) *p-- = ' ';
}
else {
do {
register h = int(i&0xf);
*p-- = (h < 10) ? h+'0' : h+a10;
} while (i>>=4);
}
return p+1;
har* oct(long ii, int w)
int m = sizeof(long)*3; // maximum oct digits for a long
if (w<0 || fld_size<w) w = 0;
int sz = (w?w:m)+1;
register char* buf = bfree;
if (max < buf+sz) buf = formbuf;
register char* p = buf+sz;
bfree = p+1;
*p-- = 0; // trailing 0
register unsigned long i = ii;
if (w) {
do {
register h = int(i&07);
*p-- = h + '0';
} while (--w && (i>>=3));
while (0<w--) *p-- = ' ';
}
else {
do {
register h = int(i&07);
*p-- = h+'0';
} while (i>>=3);
}
return p+1;
har* dec(long i, int w)
int sign = 0;
if (i < 0) {
sign = 1;
i = -i;
}
int m = sizeof(long)*3; /* maximum dec digits for a long */
if (w<0 || fld_size<w) w = 0;
int sz = (w?w:m)+1;
register char* buf = bfree;
if (max < buf+sz) buf = formbuf;
register char* p = buf+sz;
bfree = p+1;
*p-- = 0; /* trailing 0 */
if (w) {
do {
register h = int(i%10);
*p-- = h + '0';
} while (--w && (i/=10));
if (sign && 0<w) {
w--;
*p-- = '-';
}
while (0<w--) *p-- = ' ';
}
else {
do {
register h = int(i%10);
*p-- = h + '0';
} while (i/=10);
if (sign) *p-- = '-';
}
return p+1;
stream& ostream::operator<<(const char* s)
register streambuf* nbp = bp;
if (state || s==0 || *s==0) return *this;
do
if (nbp->sputc(*s++) == EOF) {
state |= _eof|_fail;
break;
}
while (*s);
return *this;
stream& ostream::operator<<(unsigned long i)
register streambuf* nbp = bp;
char buf[32];
register char *p = buf;
if (state) return *this;
do {
*p++ = '0' + int(i%10);
i = i/10;
} while (i > 0);
do {
if (nbp->sputc(*--p) == EOF) {
state |= _fail | _eof;
break;
}
} while (p != buf);
return *this;
stream& ostream::operator<<(long i)
register streambuf* nbp = bp;
register long j;
char buf[32];
register char *p = buf;
if (state) return *this;
if (i < 0) {
nbp->sputc('-');
j = -i;
} else
j = i;
do {
*p++ = '0' + char(j%10);
j = j/10;
} while (j > 0);
do {
if (nbp->sputc(*--p) == EOF) {
state |= _fail | _eof;
break;
}
} while (p != buf);
return *this;
stream& ostream::put(char c)
if (state) return *this;
if (bp->sputc(c) == EOF) state |= _eof|_fail;
return *this;
stream& ostream::operator<<(double d)
register streambuf* nbp = bp;
char buf[32];
register char *p = buf;
if (state) return *this;
sprintf(buf,"%g",d);
while (*p != '\0')
if (nbp->sputc(*p++) == EOF) {
state |= _eof|_fail;
break;
}
return *this;
stream& ostream::operator<<(const streambuf& b)
register streambuf* nbp = bp;
register int c;
if (state) return *this;
c = b.sgetc();
while (c != EOF) {
if (nbp->sputc(c) == EOF) {
state |= _eof|_fail;
break;
}
c = b.snextc();
}
return *this;